ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ಸುಧಾರಿತ ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ನ ಶಕ್ತಿಯನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ. ದೃಢವಾದ, ಅಳೆಯಬಹುದಾದ ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದಾದ ಜಾಗತಿಕ ಸಾಫ್ಟ್ವೇರ್ ಸಿಸ್ಟಮ್ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಈ ಮಾರ್ಗದರ್ಶಿ ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳು, ಮ್ಯಾಪ್ಡ್ ಟೈಪ್ಗಳು, ಇನ್ಫರೆನ್ಸ್ ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಅನ್ವೇಷಿಸುತ್ತದೆ.
ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್: ದೃಢವಾದ ಸಾಫ್ಟ್ವೇರ್ ವಿನ್ಯಾಸಕ್ಕಾಗಿ ಸುಧಾರಿತ ಟೈಪ್ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ ತಂತ್ರಗಳು
ಆಧುನಿಕ ಸಾಫ್ಟ್ವೇರ್ ಅಭಿವೃದ್ಧಿಯ ವಿಕಾಸಗೊಳ್ಳುತ್ತಿರುವ ಭೂಪ್ರದೇಶದಲ್ಲಿ, ಸ್ಥಿತಿಸ್ಥಾಪಕ, ನಿರ್ವಹಿಸಬಹುದಾದ ಮತ್ತು ಅಳೆಯಬಹುದಾದ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನಿರ್ಮಿಸುವಲ್ಲಿ ಟೈಪ್ ಸಿಸ್ಟಮ್ಗಳು ಹೆಚ್ಚೆಚ್ಚು ನಿರ್ಣಾಯಕ ಪಾತ್ರವಹಿಸುತ್ತವೆ. ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್, ನಿರ್ದಿಷ್ಟವಾಗಿ, ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಶಕ್ತಿಯುತ ಸ್ಟ್ಯಾಟಿಕ್ ಟೈಪಿಂಗ್ ಸಾಮರ್ಥ್ಯಗಳೊಂದಿಗೆ ವಿಸ್ತರಿಸುವ ಪ್ರಬಲ ಶಕ್ತಿಯಾಗಿ ಹೊರಹೊಮ್ಮಿದೆ. ಅನೇಕ ಡೆವಲಪರ್ಗಳು ಮೂಲಭೂತ ಟೈಪ್ ಡಿಕ್ಲರೇಶನ್ಗಳೊಂದಿಗೆ ಪರಿಚಿತರಾಗಿದ್ದರೂ, ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನ ನಿಜವಾದ ಶಕ್ತಿಯು ಅದರ ಸುಧಾರಿತ ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ ವೈಶಿಷ್ಟ್ಯಗಳಲ್ಲಿ ಅಡಗಿದೆ – ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪ್ರಕಾರಗಳಿಂದ ಹೊಸ ಪ್ರಕಾರಗಳನ್ನು ಡೈನಾಮಿಕ್ ಆಗಿ ಪರಿವರ್ತಿಸಲು, ವಿಸ್ತರಿಸಲು ಮತ್ತು ಪಡೆಯಲು ನಿಮಗೆ ಅನುಮತಿಸುವ ತಂತ್ರಗಳು. ಈ ಸಾಮರ್ಥ್ಯಗಳು ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಕೇವಲ ಟೈಪ್ ಪರಿಶೀಲನೆಯಿಂದ ಸಾಮಾನ್ಯವಾಗಿ "ಟೈಪ್-ಲೆವೆಲ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್" ಎಂದು ಕರೆಯಲಾಗುವ ಕ್ಷೇತ್ರಕ್ಕೆ ಸಾಗಿಸುತ್ತವೆ.
ಈ ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ ಸುಧಾರಿತ ಟೈಪ್ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ ತಂತ್ರಗಳ ಸಂಕೀರ್ಣ ಜಗತ್ತನ್ನು ವಿವರಿಸುತ್ತದೆ. ಈ ಶಕ್ತಿಯುತ ಪರಿಕರಗಳು ನಿಮ್ಮ ಕೋಡ್ಬೇಸ್ ಅನ್ನು ಹೇಗೆ ಉನ್ನತೀಕರಿಸಬಹುದು, ಡೆವಲಪರ್ ಉತ್ಪಾದಕತೆಯನ್ನು ಸುಧಾರಿಸಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಸಾಫ್ಟ್ವೇರ್ನ ಒಟ್ಟಾರೆ ದೃಢತೆಯನ್ನು ಹೆಚ್ಚಿಸಬಹುದು ಎಂಬುದನ್ನು ನಾವು ಅನ್ವೇಷಿಸುತ್ತೇವೆ, ನಿಮ್ಮ ತಂಡ ಎಲ್ಲಿದೆ ಅಥವಾ ನೀವು ಯಾವ ನಿರ್ದಿಷ್ಟ ಡೊಮೇನ್ನಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತಿದ್ದೀರಿ ಎಂಬುದನ್ನು ಲೆಕ್ಕಿಸದೆ. ಸಂಕೀರ್ಣ ಡೇಟಾ ರಚನೆಗಳನ್ನು ರಿಫ್ಯಾಕ್ಟರಿಂಗ್ ಮಾಡುವುದರಿಂದ ಹಿಡಿದು ಅತ್ಯಂತ ವಿಸ್ತರಿಸಬಹುದಾದ ಲೈಬ್ರರಿಗಳನ್ನು ರಚಿಸುವವರೆಗೆ, ಜಾಗತಿಕ ಅಭಿವೃದ್ಧಿ ಪರಿಸರದಲ್ಲಿ ಶ್ರೇಷ್ಠತೆಯನ್ನು ಗುರಿಯಾಗಿಸಿಕೊಂಡಿರುವ ಯಾವುದೇ ಗಂಭೀರ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ಡೆವಲಪರ್ಗೆ ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ ಅನ್ನು ಕರಗತ ಮಾಡಿಕೊಳ್ಳುವುದು ಒಂದು ಅವಶ್ಯಕ ಕೌಶಲ್ಯವಾಗಿದೆ.
ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ನ ಸಾರ: ಇದು ಏಕೆ ಮುಖ್ಯ
ಅದರ ಮೂಲದಲ್ಲಿ, ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ ಹೊಂದಿಕೊಳ್ಳುವ ಮತ್ತು ಹೊಂದಿಕೊಳ್ಳುವ ಟೈಪ್ ವ್ಯಾಖ್ಯಾನಗಳನ್ನು ರಚಿಸುವ ಬಗ್ಗೆ. ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ನ ವಿಭಿನ್ನ ಭಾಗಗಳಿಗೆ ಸ್ವಲ್ಪ ಮಾರ್ಪಡಿಸಿದ ಆವೃತ್ತಿಗಳ ಅಗತ್ಯವಿದ್ದರೆ, ನೀವು ಮೂಲ ಡೇಟಾ ರಚನೆಯನ್ನು ಹೊಂದಿರುವ ಸನ್ನಿವೇಶವನ್ನು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ – ಬಹುಶಃ ಕೆಲವು ಗುಣಲಕ್ಷಣಗಳು ಐಚ್ಛಿಕವಾಗಿರಬೇಕು, ಇತರವು ಓದಲು ಮಾತ್ರ, ಅಥವಾ ಗುಣಲಕ್ಷಣಗಳ ಉಪವಿಭಾಗವನ್ನು ಹೊರತೆಗೆಯಬೇಕಾಗುತ್ತದೆ. ಅನೇಕ ಟೈಪ್ ಡಿಕ್ಲರೇಶನ್ಗಳನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ನಕಲಿಸುವುದು ಮತ್ತು ನಿರ್ವಹಿಸುವುದಕ್ಕಿಂತ ಹೆಚ್ಚಾಗಿ, ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ ಈ ವ್ಯತ್ಯಾಸಗಳನ್ನು ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಆಗಿ ರಚಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಈ ವಿಧಾನವು ಹಲವಾರು ಗಂಭೀರ ಪ್ರಯೋಜನಗಳನ್ನು ನೀಡುತ್ತದೆ:
- ಕಡಿಮೆಯಾದ ಬಾಯ್ಲರ್ಪ್ಲೇಟ್: ಪುನರಾವರ್ತಿತ ಟೈಪ್ ಡಿಕ್ಲರೇಶನ್ಗಳನ್ನು ಬರೆಯುವುದನ್ನು ತಪ್ಪಿಸಿ. ಒಂದು ಮೂಲ ಪ್ರಕಾರವು ಅನೇಕ ಉತ್ಪನ್ನಗಳನ್ನು ಹುಟ್ಟುಹಾಕಬಹುದು.
- ಉನ್ನತ ಮಟ್ಟದ ನಿರ್ವಹಣೆ: ಮೂಲ ಪ್ರಕಾರದಲ್ಲಿನ ಬದಲಾವಣೆಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಎಲ್ಲಾ ಉತ್ಪನ್ನ ಪ್ರಕಾರಗಳಿಗೆ ಹರಡುತ್ತವೆ, ದೊಡ್ಡ ಕೋಡ್ಬೇಸ್ನಾದ್ಯಂತ ಅಸಂಗತತೆಗಳು ಮತ್ತು ದೋಷಗಳ ಅಪಾಯವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ. ಜಾಗತಿಕವಾಗಿ ವಿತರಿಸಿದ ತಂಡಗಳಿಗೆ ಇದು ವಿಶೇಷವಾಗಿ ಮುಖ್ಯವಾಗಿದೆ, ಅಲ್ಲಿ ಸಂವಹನ ದೋಷಗಳು ವಿಭಿನ್ನ ಟೈಪ್ ಡಿಕ್ಲರೇಶನ್ಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು.
- ಉತ್ತಮ ಟೈಪ್ ಸೇಫ್ಟಿ: ಪ್ರಕಾರಗಳನ್ನು ವ್ಯವಸ್ಥಿತವಾಗಿ ಪಡೆಯುವ ಮೂಲಕ, ನೀವು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ನಾದ್ಯಂತ ಹೆಚ್ಚಿನ ಮಟ್ಟದ ಟೈಪ್ ಸರಿಯಾಗಿರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳುತ್ತೀರಿ, ರನ್ಟೈಮ್ ಬದಲಿಗೆ ಕಂಪೈಲ್-ಟೈಮ್ನಲ್ಲಿ ಸಂಭಾವ್ಯ ದೋಷಗಳನ್ನು ಹಿಡಿಯುತ್ತೀರಿ.
- ಹೆಚ್ಚಿನ ಹೊಂದಿಕೊಳ್ಳುವಿಕೆ ಮತ್ತು ವಿಸ್ತರಣೀಯತೆ: ಟೈಪ್ ಸುರಕ್ಷತೆಯನ್ನು ತ್ಯಾಗ ಮಾಡದೆಯೇ ವಿವಿಧ ಬಳಕೆಯ ಸಂದರ್ಭಗಳಿಗೆ ಹೆಚ್ಚು ಹೊಂದಿಕೊಳ್ಳುವ API ಗಳು ಮತ್ತು ಲೈಬ್ರರಿಗಳನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸಿ. ಇದು ವಿಶ್ವಾದ್ಯಂತ ಡೆವಲಪರ್ಗಳು ನಿಮ್ಮ ಪರಿಹಾರಗಳನ್ನು ವಿಶ್ವಾಸದಿಂದ ಸಂಯೋಜಿಸಲು ಅನುಮತಿಸುತ್ತದೆ.
- ಉತ್ತಮ ಡೆವಲಪರ್ ಅನುಭವ: ಬುದ್ಧಿವಂತ ಟೈಪ್ ಇನ್ಫರೆನ್ಸ್ ಮತ್ತು ಆಟೋ-ಕಂಪ್ಲೀಷನ್ ಹೆಚ್ಚು ನಿಖರ ಮತ್ತು ಸಹಾಯಕವಾಗುತ್ತದೆ, ಅಭಿವೃದ್ಧಿಯನ್ನು ವೇಗಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಅರಿವಿನ ಹೊರೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ, ಇದು ಎಲ್ಲಾ ಡೆವಲಪರ್ಗಳಿಗೆ ಸಾರ್ವತ್ರಿಕ ಪ್ರಯೋಜನವಾಗಿದೆ.
ಟೈಪ್-ಲೆವೆಲ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಅನ್ನು ಎಷ್ಟು ಪರಿವರ್ತಕವಾಗಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಆಳವಾದ ತಂತ್ರಗಳನ್ನು ಬಹಿರಂಗಪಡಿಸಲು ಈ ಪ್ರಯಾಣವನ್ನು ಪ್ರಾರಂಭಿಸೋಣ.
ಮುಖ್ಯ ಟೈಪ್ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ ಬಿಲ್ಡಿಂಗ್ ಬ್ಲಾಕ್ಸ್: ಯುಟಿಲಿಟಿ ಟೈಪ್ಗಳು
ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ಸಾಮಾನ್ಯ ಟೈಪ್ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ಗಳಿಗಾಗಿ ಮೂಲಭೂತ ಪರಿಕರಗಳಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುವ "ಯುಟಿಲಿಟಿ ಟೈಪ್ಗಳ" ಒಂದು ಗುಂಪನ್ನು ಒದಗಿಸುತ್ತದೆ. ನಿಮ್ಮ ಸ್ವಂತ ಸಂಕೀರ್ಣ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ಗಳನ್ನು ರಚಿಸುವ ಮೊದಲು ತತ್ವಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಇವುಗಳು ಅತ್ಯುತ್ತಮ ಆರಂಭಿಕ ಬಿಂದುಗಳಾಗಿವೆ.
1. Partial<T>
ಈ ಯುಟಿಲಿಟಿ ಟೈಪ್ T ಯ ಎಲ್ಲಾ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಐಚ್ಛಿಕವಾಗಿ ಹೊಂದಿರುವ ಪ್ರಕಾರವನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ. ನೀವು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ವಸ್ತುವಿನ ಗುಣಲಕ್ಷಣಗಳ ಉಪವಿಭಾಗವನ್ನು ಪ್ರತಿನಿಧಿಸುವ ಪ್ರಕಾರವನ್ನು ರಚಿಸಬೇಕಾದಾಗ ಇದು ನಂಬಲಾಗದಷ್ಟು ಉಪಯುಕ್ತವಾಗಿದೆ, ಸಾಮಾನ್ಯವಾಗಿ ಎಲ್ಲಾ ಕ್ಷೇತ್ರಗಳನ್ನು ಒದಗಿಸದ ನವೀಕರಣ ಕಾರ್ಯಾಚರಣೆಗಳಿಗೆ.
ಉದಾಹರಣೆ:
interface UserProfile { id: string; username: string; email: string; country: string; avatarUrl?: string; }
type PartialUserProfile = Partial<UserProfile>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type PartialUserProfile = { id?: string; username?: string; email?: string; country?: string; avatarUrl?: string; }; */
const updateUserData: PartialUserProfile = { email: 'new.email@example.com' }; const newUserData: PartialUserProfile = { username: 'global_user_X', country: 'Germany' };
2. Required<T>
ವಿಲೋಮವಾಗಿ, Required<T> T ಯ ಎಲ್ಲಾ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಅಗತ್ಯವಾಗಿ ಹೊಂದಿರುವ ಪ್ರಕಾರವನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ. ನೀವು ಐಚ್ಛಿಕ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಹೊಂದಿರುವ ಇಂಟರ್ಫೇಸ್ ಹೊಂದಿರುವಾಗ ಇದು ಉಪಯುಕ್ತವಾಗಿದೆ, ಆದರೆ ನಿರ್ದಿಷ್ಟ ಸಂದರ್ಭದಲ್ಲಿ, ಆ ಗುಣಲಕ್ಷಣಗಳು ಯಾವಾಗಲೂ ಇರುತ್ತವೆ ಎಂದು ನಿಮಗೆ ತಿಳಿದಿದೆ.
ಉದಾಹರಣೆ:
interface Configuration { timeout?: number; retries?: number; apiKey: string; }
type StrictConfiguration = Required<Configuration>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type StrictConfiguration = { timeout: number; retries: number; apiKey: string; }; */
const defaultConfiguration: StrictConfiguration = { timeout: 5000, retries: 3, apiKey: 'XYZ123' };
3. Readonly<T>
ಈ ಯುಟಿಲಿಟಿ ಟೈಪ್ T ಯ ಎಲ್ಲಾ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಓದಲು ಮಾತ್ರ ಹೊಂದಿರುವ ಪ್ರಕಾರವನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ. ಇದು ಬದಲಾಗದಿರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಅಮೂಲ್ಯವಾಗಿದೆ, ವಿಶೇಷವಾಗಿ ಮೂಲ ವಸ್ತುವನ್ನು ಮಾರ್ಪಡಿಸಬಾರದ ಕಾರ್ಯಗಳಿಗೆ ಡೇಟಾವನ್ನು ರವಾನಿಸುವಾಗ, ಅಥವಾ ಸ್ಟೇಟ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್ ಸಿಸ್ಟಮ್ಗಳನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸುವಾಗ.
ಉದಾಹರಣೆ:
interface Product { id: string; name: string; price: number; }
type ImmutableProduct = Readonly<Product>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type ImmutableProduct = { readonly id: string; readonly name: string; readonly price: number; }; */
const catalogItem: ImmutableProduct = { id: 'P001', name: 'Global Widget', price: 99.99 }; // catalogItem.name = 'New Name'; // ದೋಷ: 'name' ಓದಲು ಮಾತ್ರ ಆಸ್ತಿ ಆಗಿರುವುದರಿಂದ ಅದನ್ನು ನಿಯೋಜಿಸಲಾಗುವುದಿಲ್ಲ.
4. Pick<T, K>
Pick<T, K> T ಯಿಂದ K (ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ಗಳ ಯೂನಿಯನ್) ಗುಣಲಕ್ಷಣಗಳ ಗುಂಪನ್ನು ಆರಿಸುವ ಮೂಲಕ ಪ್ರಕಾರವನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ. ದೊಡ್ಡ ಪ್ರಕಾರದಿಂದ ಗುಣಲಕ್ಷಣಗಳ ಉಪವಿಭಾಗವನ್ನು ಹೊರತೆಗೆಯಲು ಇದು ಪರಿಪೂರ್ಣವಾಗಿದೆ.
ಉದಾಹರಣೆ:
interface Employee { id: string; name: string; department: string; salary: number; email: string; }
type EmployeeOverview = Pick<Employee, 'name' | 'department' | 'email'>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type EmployeeOverview = { name: string; department: string; email: string; }; */
const hrView: EmployeeOverview = { name: 'Javier Garcia', department: 'Human Resources', email: 'javier.g@globalcorp.com' };
5. Omit<T, K>
Omit<T, K> T ಯಿಂದ ಎಲ್ಲಾ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಆರಿಸುವ ಮೂಲಕ ಪ್ರಕಾರವನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ ಮತ್ತು ನಂತರ K (ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ಗಳ ಯೂನಿಯನ್) ಅನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ. ಇದು Pick<T, K> ಯ ವಿಲೋಮವಾಗಿದೆ ಮತ್ತು ನಿರ್ದಿಷ್ಟ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಹೊರತುಪಡಿಸಿ ಉತ್ಪನ್ನ ಪ್ರಕಾರಗಳನ್ನು ರಚಿಸಲು ಸಮಾನವಾಗಿ ಉಪಯುಕ್ತವಾಗಿದೆ.
ಉದಾಹರಣೆ:
interface Employee { /* ಮೇಲಿನಂತೆಯೇ */ }
type EmployeePublicProfile = Omit<Employee, 'salary' | 'id'>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type EmployeePublicProfile = { name: string; department: string; email: string; }; */
const publicInfo: EmployeePublicProfile = { name: 'Javier Garcia', department: 'Human Resources', email: 'javier.g@globalcorp.com' };
6. Exclude<T, U>
Exclude<T, U> U ಗೆ ನಿಯೋಜಿಸಬಹುದಾದ ಎಲ್ಲಾ ಯೂನಿಯನ್ ಸದಸ್ಯರನ್ನು ಹೊರತುಪಡಿಸುವ ಮೂಲಕ T ಯಿಂದ ಪ್ರಕಾರವನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ. ಇದು ಮುಖ್ಯವಾಗಿ ಯೂನಿಯನ್ ಪ್ರಕಾರಗಳಿಗೆ.
ಉದಾಹರಣೆ:
type EventStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled'; type ActiveStatus = Exclude<EventStatus, 'completed' | 'failed' | 'cancelled'>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type ActiveStatus = "pending" | "processing"; */
7. Extract<T, U>
Extract<T, U> U ಗೆ ನಿಯೋಜಿಸಬಹುದಾದ ಎಲ್ಲಾ ಯೂನಿಯನ್ ಸದಸ್ಯರನ್ನು ಹೊರತೆಗೆಯುವ ಮೂಲಕ T ಯಿಂದ ಪ್ರಕಾರವನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ. ಇದು Exclude<T, U> ಯ ವಿಲೋಮವಾಗಿದೆ.
ಉದಾಹರಣೆ:
type AllDataTypes = string | number | boolean | string[] | { key: string }; type ObjectTypes = Extract<AllDataTypes, object>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type ObjectTypes = string[] | { key: string }; */
8. NonNullable<T>
NonNullable<T> T ಯಿಂದ null ಮತ್ತು undefined ಅನ್ನು ಹೊರತುಪಡಿಸುವ ಮೂಲಕ ಪ್ರಕಾರವನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ. null ಅಥವಾ undefined ಮೌಲ್ಯಗಳನ್ನು ನಿರೀಕ್ಷಿಸದ ಪ್ರಕಾರಗಳನ್ನು ಕಟ್ಟುನಿಟ್ಟಾಗಿ ವ್ಯಾಖ್ಯಾನಿಸಲು ಉಪಯುಕ್ತವಾಗಿದೆ.
ಉದಾಹರಣೆ:
type NullableString = string | null | undefined; type CleanString = NonNullable<NullableString>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type CleanString = string; */
9. Record<K, T>
Record<K, T> ಯ ಗುಣಲಕ್ಷಣ ಕೀಲಿಗಳು K ಮತ್ತು ಅದರ ಗುಣಲಕ್ಷಣ ಮೌಲ್ಯಗಳು T ಆಗಿರುವ ವಸ್ತುವಿನ ಪ್ರಕಾರವನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ. ಇದು ನಿಘಂಟು-ರೀತಿಯ ಪ್ರಕಾರಗಳನ್ನು ರಚಿಸಲು ಶಕ್ತಿಯುತವಾಗಿದೆ.
ಉದಾಹರಣೆ:
type Countries = 'USA' | 'Japan' | 'Brazil' | 'Kenya'; type CurrencyMapping = Record<Countries, string>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type CurrencyMapping = { USA: string; Japan: string; Brazil: string; Kenya: string; }; */
const countryCurrencies: CurrencyMapping = { USA: 'USD', Japan: 'JPY', Brazil: 'BRL', Kenya: 'KES' };
ಈ ಯುಟಿಲಿಟಿ ಪ್ರಕಾರಗಳು ಮೂಲಭೂತವಾಗಿವೆ. ಪೂರ್ವ-ನಿರ್ಧರಿತ ನಿಯಮಗಳ ಆಧಾರದ ಮೇಲೆ ಒಂದು ಪ್ರಕಾರವನ್ನು ಇನ್ನೊಂದಕ್ಕೆ ಪರಿವರ್ತಿಸುವ ಪರಿಕಲ್ಪನೆಯನ್ನು ಅವು ಪ್ರದರ್ಶಿಸುತ್ತವೆ. ಈಗ, ಅಂತಹ ನಿಯಮಗಳನ್ನು ನಾವು ಹೇಗೆ ರಚಿಸಬಹುದು ಎಂಬುದನ್ನು ಅನ್ವೇಷಿಸೋಣ.
ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳು: ಟೈಪ್ ಲೆವೆಲ್ನಲ್ಲಿ "ಇಫ್-ಎಸ್" ನ ಶಕ್ತಿ
ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳು ಷರತ್ತಿನ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿರುವ ಪ್ರಕಾರವನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಅವು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ಕಂಡಿಷನಲ್ (ಟರ್ನರಿ) ಆಪರೇಟರ್ಗಳಿಗೆ (condition ? trueExpression : falseExpression) ಸಮಾನವಾಗಿವೆ ಆದರೆ ಪ್ರಕಾರಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ. ಸಿಂಟ್ಯಾಕ್ಸ್ T extends U ? X : Y.
ಇದರರ್ಥ: T ಪ್ರಕಾರವು U ಪ್ರಕಾರಕ್ಕೆ ನಿಯೋಜಿಸಬಹುದಾದರೆ, ಫಲಿತಾಂಶದ ಪ್ರಕಾರ X ಆಗಿರುತ್ತದೆ; ಇಲ್ಲದಿದ್ದರೆ, ಅದು Y ಆಗಿರುತ್ತದೆ.
ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳು ಟೈಪ್ ಸಿಸ್ಟಂನಲ್ಲಿ ತರ್ಕವನ್ನು ಪರಿಚಯಿಸುವುದರಿಂದ ಸುಧಾರಿತ ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ಗೆ ಅತ್ಯಂತ ಶಕ್ತಿಯುತ ವೈಶಿಷ್ಟ್ಯಗಳಲ್ಲಿ ಒಂದಾಗಿದೆ.
ಮೂಲಭೂತ ಉದಾಹರಣೆ:
ಒಂದು ಸರಳೀಕೃತ NonNullable ಅನ್ನು ಮರು-ಅನುಷ್ಠಾನಗೊಳಿಸೋಣ:
type MyNonNullable<T> = T extends null | undefined ? never : T;
type Result1 = MyNonNullable<string | null>; // string type Result2 = MyNonNullable<number | undefined>; // number type Result3 = MyNonNullable<boolean>; // boolean
ಇಲ್ಲಿ, T null ಅಥವಾ undefined ಆಗಿದ್ದರೆ, ಅದನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ (never ನಿಂದ ಪ್ರತಿನಿಧಿಸಲಾಗುತ್ತದೆ, ಇದು ಯೂನಿಯನ್ ಪ್ರಕಾರದಿಂದ ಪರಿಣಾಮಕಾರಿಯಾಗಿ ತೆಗೆದುಹಾಕುತ್ತದೆ). ಇಲ್ಲದಿದ್ದರೆ, T ಉಳಿಯುತ್ತದೆ.
ಡಿಸ್ಟ್ರಿಬ್ಯೂಟಿವ್ ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳು:
ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳ ಒಂದು ಪ್ರಮುಖ ನಡವಳಿಕೆಯೆಂದರೆ ಯೂನಿಯನ್ ಪ್ರಕಾರಗಳ ಮೇಲೆ ಅವುಗಳ ವಿತರಣೆ. ಒಂದು ಕಂಡಿಷನಲ್ ಟೈಪ್ ಬೇರ್ಡ್ ಟೈಪ್ ಪ್ಯಾರಾಮೀಟರ್ (ಇನ್ನೊಂದು ಪ್ರಕಾರದಲ್ಲಿ ಸುತ್ತುವರಿಯದ ಟೈಪ್ ಪ್ಯಾರಾಮೀಟರ್) ಮೇಲೆ ಕಾರ್ಯನಿರ್ವಹಿಸಿದಾಗ, ಅದು ಯೂನಿಯನ್ ಸದಸ್ಯರ ಮೇಲೆ ವಿತರಿಸುತ್ತದೆ. ಇದರರ್ಥ ಕಂಡಿಷನಲ್ ಟೈಪ್ ಅನ್ನು ಯೂನಿಯನ್ನ ಪ್ರತಿ ಸದಸ್ಯರ ಮೇಲೆ ಪ್ರತ್ಯೇಕವಾಗಿ ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ, ಮತ್ತು ಫಲಿತಾಂಶಗಳನ್ನು ನಂತರ ಹೊಸ ಯೂನಿಯನ್ ಆಗಿ ಸಂಯೋಜಿಸಲಾಗುತ್ತದೆ.
ವಿತರಣೆಯ ಉದಾಹರಣೆ:
ಒಂದು ಪ್ರಕಾರವು ಸ್ಟ್ರಿಂಗ್ ಅಥವಾ ಸಂಖ್ಯೆಯೋ ಎಂದು ಪರಿಶೀಲಿಸುವ ಪ್ರಕಾರವನ್ನು ಪರಿಗಣಿಸಿ:
type IsStringOrNumber<T> = T extends string | number ? 'stringOrNumber' : 'other';
type Test1 = IsStringOrNumber<string>; // "stringOrNumber" type Test2 = IsStringOrNumber<boolean>; // "other" type Test3 = IsStringOrNumber<string | boolean>; // "stringOrNumber" | "other" (ಇದು ವಿತರಿಸುವುದರಿಂದ)
ವಿತರಣೆ ಇಲ್ಲದೆ, Test3 string | boolean string | number ಗೆ ವಿಸ್ತರಿಸುತ್ತದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸುತ್ತದೆ (ಇದು ಸಂಪೂರ್ಣವಾಗಿ ಮಾಡುವುದಿಲ್ಲ), ಸಂಭಾವ್ಯವಾಗಿ "other" ಗೆ ಕಾರಣವಾಗುತ್ತದೆ. ಆದರೆ ಇದು ವಿತರಿಸುವುದರಿಂದ, ಇದು string extends string | number ? ... : ... ಮತ್ತು boolean extends string | number ? ... : ... ಅನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿ ಮೌಲ್ಯಮಾಪನ ಮಾಡುತ್ತದೆ, ನಂತರ ಫಲಿತಾಂಶಗಳನ್ನು ಯೂನಿಯನ್ ಮಾಡುತ್ತದೆ.
ವ್ಯವಹಾರಿಕ ಅನ್ವಯ: ಟೈಪ್ ಯೂನಿಯನ್ ಅನ್ನು ಫ್ಲಾಟ್ ಮಾಡುವುದು
ನೀವು ಆಬ್ಜೆಕ್ಟ್ಗಳ ಯೂನಿಯನ್ ಅನ್ನು ಹೊಂದಿದ್ದೀರಿ ಮತ್ತು ಸಾಮಾನ್ಯ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಹೊರತೆಗೆಯಲು ಅಥವಾ ಅವುಗಳನ್ನು ನಿರ್ದಿಷ್ಟ ರೀತಿಯಲ್ಲಿ ವಿಲೀನಗೊಳಿಸಲು ಬಯಸುತ್ತೀರಿ ಎಂದು ಹೇಳೋಣ. ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳು ಇಲ್ಲಿ ಪ್ರಮುಖವಾಗಿವೆ.
type Flatten<T> = T extends infer R ? { [K in keyof R]: R[K] } : never;
ಈ ಸರಳ Flatten ತನ್ನದೇ ಆದದರಲ್ಲಿ ಹೆಚ್ಚು ಮಾಡದಿದ್ದರೂ, ಅದು ಕಂಡಿಷನಲ್ ಟೈಪ್ ಅನ್ನು ವಿತರಣೆಗೆ "ಪ್ರಚೋದಕ" ಆಗಿ ಹೇಗೆ ಬಳಸಬಹುದು ಎಂಬುದನ್ನು ವಿವರಿಸುತ್ತದೆ, ವಿಶೇಷವಾಗಿ ನಾವು ಮುಂದಿನದನ್ನು ಚರ್ಚಿಸುವ infer ಕೀವರ್ಡ್ನೊಂದಿಗೆ ಸಂಯೋಜಿಸಿದಾಗ.
ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳು ಅತ್ಯಾಧುನಿಕ ಟೈಪ್-ಲೆವೆಲ್ ತರ್ಕವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತವೆ, ಅವುಗಳನ್ನು ಸುಧಾರಿತ ಟೈಪ್ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ಗಳ ಮೂಲಾಧಾರವಾಗಿಸುತ್ತವೆ. ಅವುಗಳನ್ನು ಸಾಮಾನ್ಯವಾಗಿ ಇತರ ತಂತ್ರಗಳೊಂದಿಗೆ ಸಂಯೋಜಿಸಲಾಗುತ್ತದೆ, ವಿಶೇಷವಾಗಿ infer ಕೀವರ್ಡ್.
ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳಲ್ಲಿ ಇನ್ಫರೆನ್ಸ್: 'infer' ಕೀವರ್ಡ್
infer ಕೀವರ್ಡ್ ಕಂಡಿಷನಲ್ ಟೈಪ್ನ extends ಕ್ಲಾಸ್ನಲ್ಲಿ ಟೈಪ್ ವೇರಿಯೇಬಲ್ ಅನ್ನು ಘೋಷಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಈ ವೇರಿಯೇಬಲ್ ಅನ್ನು ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿರುವ ಪ್ರಕಾರದ ನಿರ್ದಿಷ್ಟ ಭಾಗವನ್ನು "ಕ್ಯಾಪ್ಚರ್" ಮಾಡಲು ಬಳಸಬಹುದು, ಅದನ್ನು ಕಂಡಿಷನಲ್ ಟೈಪ್ನ ನಿಜವಾದ ಶಾಖೆಯಲ್ಲಿ ಲಭ್ಯವಾಗುವಂತೆ ಮಾಡುತ್ತದೆ. ಇದು ಪ್ರಕಾರಗಳಿಗಾಗಿ ಪ್ಯಾಟರ್ನ್ ಮ್ಯಾಚಿಂಗ್ ತರಹ.
ಸಿಂಟ್ಯಾಕ್ಸ್: T extends SomeType<infer U> ? U : FallbackType;
ಇದು ಪ್ರಕಾರಗಳನ್ನು ವಿಘಟಿಸಲು ಮತ್ತು ಅವುಗಳ ಭಾಗಗಳನ್ನು ಹೊರತೆಗೆಯಲು ಅಸಾಧಾರಣವಾಗಿ ಶಕ್ತಿಯುತವಾಗಿದೆ. ಅದರ ಕಾರ್ಯವಿಧಾನವನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು infer ನೊಂದಿಗೆ ಮರು-ಅನುಷ್ಠಾನಗೊಂಡ ಕೆಲವು ಮೂಲಭೂತ ಯುಟಿಲಿಟಿ ಟೈಪ್ಗಳನ್ನು ನೋಡೋಣ.
1. ReturnType<T>
ಈ ಯುಟಿಲಿಟಿ ಟೈಪ್ ಫಂಕ್ಷನ್ ಪ್ರಕಾರದ ರಿಟರ್ನ್ ಪ್ರಕಾರವನ್ನು ಹೊರತೆಗೆಯುತ್ತದೆ. ಜಾಗತಿಕ ಯುಟಿಲಿಟಿ ಫಂಕ್ಷನ್ಗಳ ಗುಂಪನ್ನು ಹೊಂದಿರುವ ಮತ್ತು ಅವುಗಳನ್ನು ಕರೆದೆಯೇ ಅವು ಉತ್ಪಾದಿಸುವ ಡೇಟಾದ ನಿಖರವಾದ ಪ್ರಕಾರವನ್ನು ತಿಳಿಯಬೇಕಾದ ಕಲ್ಪನೆಯನ್ನು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ.
ಅಧಿಕೃತ ಅನುಷ್ಠಾನ (ಸರಳೀಕೃತ):
type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
ಉದಾಹರಣೆ:
function getUserData(userId: string): { id: string; name: string; email: string } { return { id: userId, name: 'John Doe', email: 'john.doe@example.com' }; }
type UserDataType = MyReturnType<typeof getUserData>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type UserDataType = { id: string; name: string; email: string; }; */
2. Parameters<T>
ಈ ಯುಟಿಲಿಟಿ ಟೈಪ್ ಫಂಕ್ಷನ್ ಪ್ರಕಾರದ ಪ್ಯಾರಾಮೀಟರ್ ಪ್ರಕಾರಗಳನ್ನು ಟುಪಲ್ ಆಗಿ ಹೊರತೆಗೆಯುತ್ತದೆ. ಟೈಪ್-ಸೇಫ್ ರ್ಯಾಪರ್ಗಳು ಅಥವಾ ಡೆಕೊರೇಟರ್ಗಳನ್ನು ರಚಿಸಲು ಅಗತ್ಯ.
ಅಧಿಕೃತ ಅನುಷ್ಠಾನ (ಸರಳೀಕೃತ):
type MyParameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
ಉದಾಹರಣೆ:
function sendNotification(userId: string, message: string, priority: 'low' | 'medium' | 'high'): boolean { console.log(`Sending notification to ${userId}: ${message} with priority ${priority}`); return true; }
type NotificationArgs = MyParameters<typeof sendNotification>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type NotificationArgs = [userId: string, message: string, priority: 'low' | 'medium' | 'high']; */
3. UnpackPromise<T>
ಅಸಿಂಕ್ರೊನಸ್ ಕಾರ್ಯಾಚರಣೆಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ಇದು ಒಂದು ಸಾಮಾನ್ಯ ಕಸ್ಟಮ್ ಯುಟಿಲಿಟಿ ಟೈಪ್ ಆಗಿದೆ. ಇದು Promise ನಿಂದ ಪರಿಹರಿಸಲಾದ ಮೌಲ್ಯದ ಪ್ರಕಾರವನ್ನು ಹೊರತೆಗೆಯುತ್ತದೆ.
type UnpackPromise<T> = T extends Promise<infer U> ? U : T;
ಉದಾಹರಣೆ:
async function fetchConfig(): Promise<{ apiBaseUrl: string; timeout: number }> { return { apiBaseUrl: 'https://api.globalapp.com', timeout: 60000 }; }
type ConfigType = UnpackPromise<ReturnType<typeof fetchConfig>>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type ConfigType = { apiBaseUrl: string; timeout: number; }; */
infer ಕೀವರ್ಡ್, ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳೊಂದಿಗೆ ಸಂಯೋಜಿಸಲ್ಪಟ್ಟಿದೆ, ಸಂಕೀರ್ಣ ಪ್ರಕಾರಗಳ ಭಾಗಗಳನ್ನು ಆಂತರಿಕವಾಗಿ ಪರಿಶೀಲಿಸಲು ಮತ್ತು ಹೊರತೆಗೆಯಲು ಒಂದು ಯಾಂತ್ರಿಕತೆಯನ್ನು ಒದಗಿಸುತ್ತದೆ, ಇದು ಅನೇಕ ಸುಧಾರಿತ ಟೈಪ್ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ಗಳಿಗೆ ಆಧಾರವನ್ನು ರೂಪಿಸುತ್ತದೆ.
ಮ್ಯಾಪ್ಡ್ ಟೈಪ್ಗಳು: ಆಬ್ಜೆಕ್ಟ್ ಆಕಾರಗಳನ್ನು ಸುವ್ಯವಸ್ಥಿತವಾಗಿ ಪರಿವರ್ತಿಸುವುದು
ಮ್ಯಾಪ್ಡ್ ಟೈಪ್ಗಳು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಆಬ್ಜೆಕ್ಟ್ ಪ್ರಕಾರದ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಪರಿವರ್ತಿಸುವ ಮೂಲಕ ಹೊಸ ಆಬ್ಜೆಕ್ಟ್ ಪ್ರಕಾರಗಳನ್ನು ರಚಿಸಲು ಒಂದು ಶಕ್ತಿಯುತ ವೈಶಿಷ್ಟ್ಯವಾಗಿದೆ. ಅವುಗಳು ಒಂದು ನಿರ್ದಿಷ್ಟ ಪ್ರಕಾರದ ಕೀಲಿಗಳ ಮೇಲೆ ಪುನರಾವರ್ತಿಸುತ್ತವೆ ಮತ್ತು ಪ್ರತಿ ಗುಣಲಕ್ಷಣಕ್ಕೆ ಒಂದು ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ ಅನ್ನು ಅನ್ವಯಿಸುತ್ತವೆ. ಸಿಂಟ್ಯಾಕ್ಸ್ ಸಾಮಾನ್ಯವಾಗಿ [P in K]: T[P] ನಂತೆ ಕಾಣುತ್ತದೆ, ಅಲ್ಲಿ K ಸಾಮಾನ್ಯವಾಗಿ keyof T.
ಮೂಲಭೂತ ಸಿಂಟ್ಯಾಕ್ಸ್:
type MyMappedType<T> = { [P in keyof T]: T[P]; // ಇಲ್ಲಿ ಯಾವುದೇ ನಿಜವಾದ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ ಇಲ್ಲ, ಕೇವಲ ಗುಣಲಕ್ಷಣಗಳನ್ನು ನಕಲಿಸುವುದು };
ಇದು ಮೂಲಭೂತ ರಚನೆಯಾಗಿದೆ. ನೀವು ಆವರಣದೊಳಗೆ ಗುಣಲಕ್ಷಣ ಅಥವಾ ಮೌಲ್ಯದ ಪ್ರಕಾರವನ್ನು ಮಾರ್ಪಡಿಸಿದಾಗ ಮ್ಯಾಜಿಕ್ ಸಂಭವಿಸುತ್ತದೆ.
ಉದಾಹರಣೆ: `Readonly
type MyReadonly<T> = { readonly [P in keyof T]: T[P]; };
ಉದಾಹರಣೆ: `Partial
type MyPartial<T> = { [P in keyof T]?: T[P]; };
? P in keyof T ನಂತರ ಐಚ್ಛಿಕ ಗುಣಲಕ್ಷಣವಾಗಿಸುತ್ತದೆ. ಅದೇ ರೀತಿ, ನೀವು -[P in keyof T]?: T[P] ನೊಂದಿಗೆ ಐಚ್ಛಿಕತೆಯನ್ನು ತೆಗೆದುಹಾಕಬಹುದು ಮತ್ತು -readonly [P in keyof T]: T[P] ನೊಂದಿಗೆ ಓದಲು ಮಾತ್ರ ಗುಣಲಕ್ಷಣಗಳನ್ನು ತೆಗೆದುಹಾಕಬಹುದು.
'as' ಕ್ಲಾಸ್ನೊಂದಿಗೆ ಕೀಲಿಗಳನ್ನು ಮರು-ಮ್ಯಾಪಿಂಗ್ ಮಾಡುವುದು:
ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ 4.1 ಮ್ಯಾಪ್ಡ್ ಟೈಪ್ಗಳಲ್ಲಿ as ಕ್ಲಾಸ್ ಅನ್ನು ಪರಿಚಯಿಸಿತು, ಗುಣಲಕ್ಷಣ ಕೀಲಿಗಳನ್ನು ಮರು-ಮ್ಯಾಪಿಂಗ್ ಮಾಡಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಗುಣಲಕ್ಷಣ ಹೆಸರುಗಳನ್ನು ಪರಿವರ್ತಿಸಲು, ಪೂರ್ವಪ್ರತ್ಯಯ/ಪ್ರತ್ಯಯಗಳನ್ನು ಸೇರಿಸಲು, ಕೇಸಿಂಗ್ ಬದಲಾಯಿಸಲು ಅಥವಾ ಕೀಲಿಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡಲು ಇದು ಅಸಾಧಾರಣವಾಗಿ ಉಪಯುಕ್ತವಾಗಿದೆ.
ಸಿಂಟ್ಯಾಕ್ಸ್: [P in K as NewKeyType]: T[P];
ಉದಾಹರಣೆ: ಎಲ್ಲಾ ಕೀಲಿಗಳಿಗೆ ಪೂರ್ವಪ್ರತ್ಯಯವನ್ನು ಸೇರಿಸುವುದು
type EventPayload = { userId: string; action: string; timestamp: number; };
type PrefixedPayload<T> = { [K in keyof T as `event${Capitalize<string & K>}`]: T[K]; };
type TrackedEvent = PrefixedPayload<EventPayload>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type TrackedEvent = { eventUserId: string; eventAction: string; eventTimestamp: number; }; */
ಇಲ್ಲಿ, Capitalize<string & K> ಟೆಂಪ್ಲೇಟ್ ಲಿಟರಲ್ ಟೈಪ್ (ಮುಂದೆ ಚರ್ಚಿಸಲಾಗಿದೆ) ಆಗಿದ್ದು ಅದು ಕೀಲಿಯಲ್ಲಿನ ಮೊದಲ ಅಕ್ಷರವನ್ನು ದೊಡ್ಡಕ್ಷರಗೊಳಿಸುತ್ತದೆ. string & K Capitalize ಯುಟಿಲಿಟಿಗಾಗಿ K ಅನ್ನು ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ ಆಗಿ ಪರಿಗಣಿಸಲಾಗುತ್ತದೆ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ.
ಮ್ಯಾಪಿಂಗ್ ಸಮಯದಲ್ಲಿ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡುವುದು:
ನೀವು ನಿರ್ದಿಷ್ಟ ಪ್ರಕಾರವನ್ನು ಹೊಂದಿರುವ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡಲು ಅಥವಾ ಷರತ್ತುಬದ್ಧವಾಗಿ ಮರುಹೆಸರಿಸಲು ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳನ್ನು as ಕ್ಲಾಸ್ನಲ್ಲಿ ಬಳಸಬಹುದು. ಕಂಡಿಷನಲ್ ಟೈಪ್ never ಗೆ ಪರಿಹರಿಸಿದರೆ, ಗುಣಲಕ್ಷಣವನ್ನು ಹೊಸ ಪ್ರಕಾರದಿಂದ ಹೊರಗಿಡಲಾಗುತ್ತದೆ.
ಉದಾಹರಣೆ: ನಿರ್ದಿಷ್ಟ ಪ್ರಕಾರವನ್ನು ಹೊಂದಿರುವ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಹೊರಗಿಡುವುದು
type Config = { appName: string; version: number; debugMode: boolean; apiEndpoint: string; };
type StringProperties<T> = { [K in keyof T as T[K] extends string ? K : never]: T[K]; };
type AppStringConfig = StringProperties<Config>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type AppStringConfig = { appName: string; apiEndpoint: string; }; */
ವಸ್ತುಗಳ ಆಕಾರವನ್ನು ಪರಿವರ್ತಿಸಲು ಮ್ಯಾಪ್ಡ್ ಟೈಪ್ಗಳು ಅಸಾಧಾರಣವಾಗಿ ಬಹುಮುಖವಾಗಿವೆ, ಇದು ಡೇಟಾ ಸಂಸ್ಕರಣೆ, API ವಿನ್ಯಾಸ ಮತ್ತು ವಿವಿಧ ಪ್ರದೇಶಗಳು ಮತ್ತು ಪ್ಲಾಟ್ಫಾರ್ಮ್ಗಳಲ್ಲಿ ಕಾಂಪೊನೆಂಟ್ ಪ್ರೊಪ್ ನಿರ್ವಹಣೆಯಲ್ಲಿ ಸಾಮಾನ್ಯ ಅವಶ್ಯಕತೆಯಾಗಿದೆ.
ಟೆೆಂಪ್ಲೇಟ್ ಲಿಟರಲ್ ಟೈಪ್ಗಳು: ಪ್ರಕಾರಗಳಿಗಾಗಿ ಸ್ಟ್ರಿಂಗ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್
ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ 4.1 ರಲ್ಲಿ ಪರಿಚಯಿಸಲಾಯಿತು, ಟೆಂಪ್ಲೇಟ್ ಲಿಟರಲ್ ಟೈಪ್ಗಳು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನ ಟೆಂಪ್ಲೇಟ್ ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ಗಳ ಶಕ್ತಿಯನ್ನು ಟೈಪ್ ಸಿಸ್ಟಂಗೆ ತರುತ್ತವೆ. ಅವುಗಳು ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ಗಳನ್ನು ಯೂನಿಯನ್ ಟೈಪ್ಗಳು ಮತ್ತು ಇತರ ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ ಪ್ರಕಾರಗಳೊಂದಿಗೆ ಸಂಯೋಜಿಸುವ ಮೂಲಕ ಹೊಸ ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ ಪ್ರಕಾರಗಳನ್ನು ನಿರ್ಮಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಈ ವೈಶಿಷ್ಟ್ಯವು ನಿರ್ದಿಷ್ಟ ಸ್ಟ್ರಿಂಗ್ ಮಾದರಿಗಳನ್ನು ಆಧರಿಸಿದ ಪ್ರಕಾರಗಳನ್ನು ರಚಿಸಲು ಅಪಾರ ಸಾಧ್ಯತೆಗಳನ್ನು ತೆರೆಯುತ್ತದೆ.
ಸಿಂಟ್ಯಾಕ್ಸ್: ಬ್ಯಾಕ್ಟಿಕ್ಗಳನ್ನು (`) ಬಳಸಲಾಗುತ್ತದೆ, ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಟೆಂಪ್ಲೇಟ್ ಲಿಟರಲ್ಗಳಂತೆ, ಪ್ಲೇಸ್ಹೋಲ್ಡರ್ಗಳಲ್ಲಿ (${Type}) ಪ್ರಕಾರಗಳನ್ನು ಎಂಬೆಡ್ ಮಾಡಲು.
ಉದಾಹರಣೆ: ಮೂಲ ಸಂಯೋಜನೆ
type Greeting = 'Hello'; type Name = 'World' | 'Universe'; type FullGreeting = `${Greeting} ${Name}!`; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type FullGreeting = "Hello World!" | "Hello Universe!"; */
ಇದು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ ಪ್ರಕಾರಗಳನ್ನು ಆಧರಿಸಿ ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ಗಳ ಯೂನಿಯನ್ ಪ್ರಕಾರಗಳನ್ನು ಉತ್ಪಾದಿಸಲು ಸಾಕಷ್ಟು ಶಕ್ತಿಯುತವಾಗಿದೆ.
ಅಂತರ್ನಿರ್ಮಿತ ಸ್ಟ್ರಿಂಗ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ ಯುಟಿಲಿಟಿ ಟೈಪ್ಗಳು:
ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ಸಾಮಾನ್ಯ ಸ್ಟ್ರಿಂಗ್ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ಗಳಿಗಾಗಿ ಟೆಂಪ್ಲೇಟ್ ಲಿಟರಲ್ ಟೈಪ್ಗಳನ್ನು ಬಳಸಿಕೊಳ್ಳುವ ನಾಲ್ಕು ಅಂತರ್ನಿರ್ಮಿತ ಯುಟಿಲಿಟಿ ಪ್ರಕಾರಗಳನ್ನು ಸಹ ಒದಗಿಸುತ್ತದೆ:
- Capitalize<S>: ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ ಪ್ರಕಾರದ ಮೊದಲ ಅಕ್ಷರವನ್ನು ಅದರ ದೊಡ್ಡಕ್ಷರ ಸಮಾನವಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ.
- Lowercase<S>: ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ ಪ್ರಕಾರದಲ್ಲಿನ ಪ್ರತಿಯೊಂದು ಅಕ್ಷರವನ್ನು ಅದರ ಸಣ್ಣಕ್ಷರ ಸಮಾನವಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ.
- Uppercase<S>: ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ ಪ್ರಕಾರದಲ್ಲಿನ ಪ್ರತಿಯೊಂದು ಅಕ್ಷರವನ್ನು ಅದರ ದೊಡ್ಡಕ್ಷರ ಸಮಾನವಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ.
- Uncapitalize<S>: ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ ಪ್ರಕಾರದ ಮೊದಲ ಅಕ್ಷರವನ್ನು ಅದರ ಸಣ್ಣಕ್ಷರ ಸಮಾನವಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ.
ಉದಾಹರಣೆ ಬಳಕೆ:
type Locale = 'en-US' | 'fr-CA' | 'ja-JP'; type EventAction = 'click' | 'hover' | 'submit';
type EventID = `${Uppercase<EventAction>}_${Capitalize<Locale>}`; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type EventID = "CLICK_En-US" | "CLICK_Fr-CA" | "CLICK_Ja-JP" | "HOVER_En-US" | "HOVER_Fr-CA" | "HOVER_Ja-JP" | "SUBMIT_En-US" | "SUBMIT_Fr-CA" | "SUBMIT_Ja-JP"; */
ಇದು ಅಂತರರಾಷ್ಟ್ರೀಯ ಈವೆಂಟ್ ID ಗಳು, API ಎಂಡ್ಪಾಯಿಂಟ್ಗಳು ಅಥವಾ ಟೈಪ್-ಸೇಫ್ ರೀತಿಯಲ್ಲಿ CSS ಕ್ಲಾಸ್ ಹೆಸರುಗಳಂತಹ ಸಂಕೀರ್ಣ ಸ್ಟ್ರಿಂಗ್ ಲಿಟರಲ್ ಯೂನಿಯನ್ಗಳನ್ನು ನೀವು ಹೇಗೆ ರಚಿಸಬಹುದು ಎಂಬುದನ್ನು ತೋರಿಸುತ್ತದೆ.
ಡೈನಾಮಿಕ್ ಕೀಲಿಗಳಿಗಾಗಿ ಮ್ಯಾಪ್ಡ್ ಟೈಪ್ಗಳೊಂದಿಗೆ ಸಂಯೋಜಿಸುವುದು:
ಟೆೆಂಪ್ಲೇಟ್ ಲಿಟರಲ್ ಟೈಪ್ಗಳ ನಿಜವಾದ ಶಕ್ತಿಯು ಸಾಮಾನ್ಯವಾಗಿ ಕೀಲಿ ಮರು-ಮ್ಯಾಪಿಂಗ್ಗಾಗಿ as ಕ್ಲಾಸ್ ಮತ್ತು ಮ್ಯಾಪ್ಡ್ ಟೈಪ್ಗಳೊಂದಿಗೆ ಸಂಯೋಜಿಸಲ್ಪಟ್ಟಾಗ ಹೊಳೆಯುತ್ತದೆ.
ಉದಾಹರಣೆ: ವಸ್ತುವಿಗೆ ಗೆಟರ್/ಸೆಟರ್ ಪ್ರಕಾರಗಳನ್ನು ರಚಿಸಿ
interface Settings { theme: 'dark' | 'light'; notificationsEnabled: boolean; }
type GetterSetters<T> = { [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K]; } & { [K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void; };
type SettingsAPI = GetterSetters<Settings>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type SettingsAPI = { getTheme: () => "dark" | "light"; getNotificationsEnabled: () => boolean; } & { setTheme: (value: "dark" | "light") => void; setNotificationsEnabled: (value: boolean) => void; }; */
ಈ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ ನಿಮ್ಮ ಮೂಲ Settings ಇಂಟರ್ಫೇಸ್ನಿಂದ ನೇರವಾಗಿ getTheme(), setTheme('dark'), ಇತ್ಯಾದಿ ಕಾರ್ಯಗಳನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ, ಎಲ್ಲಾ ಬಲವಾದ ಟೈಪ್ ಸುರಕ್ಷತೆಯೊಂದಿಗೆ. ಇದು ಬ್ಯಾಕೆಂಡ್ API ಗಳು ಅಥವಾ ಕಾನ್ಫಿಗರೇಶನ್ ಆಬ್ಜೆಕ್ಟ್ಗಳ ಬಲವಾದ ಟೈಪ್ಡ್ ಕ್ಲೈಂಟ್ ಇಂಟರ್ಫೇಸ್ಗಳನ್ನು ಉತ್ಪಾದಿಸಲು ಅಮೂಲ್ಯವಾಗಿದೆ.
ರಿಕರ್ಸಿವ್ ಟೈಪ್ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ಗಳು: ನೆಸ್ಟೆಡ್ ರಚನೆಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು
ಅನೇಕ ನೈಜ-ಜೀವನದ ಡೇಟಾ ರಚನೆಗಳು ಆಳವಾಗಿ ನೆಸ್ಟೆಡ್ ಆಗಿವೆ. API ಗಳಿಂದ ಹಿಂತಿರುಗಿಸಲಾದ ಸಂಕೀರ್ಣ JSON ಆಬ್ಜೆಕ್ಟ್ಗಳು, ಕಾನ್ಫಿಗರೇಶನ್ ಟ್ರೀಗಳು, ಅಥವಾ ನೆಸ್ಟೆಡ್ ಕಾಂಪೊನೆಂಟ್ ಪ್ರೊಪ್ಗಳನ್ನು ಯೋಚಿಸಿ. ಈ ರಚನೆಗಳಿಗೆ ಟೈಪ್ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ಗಳನ್ನು ಅನ್ವಯಿಸುವುದು ಸಾಮಾನ್ಯವಾಗಿ ರಿಕರ್ಸಿವ್ ವಿಧಾನದ ಅಗತ್ಯವಿರುತ್ತದೆ. ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನ ಟೈಪ್ ಸಿಸ್ಟಂ ರಿಕರ್ಶನ್ ಅನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ, ಸ್ವಯಂ-ಉಲ್ಲೇಖಿಸುವ ಪ್ರಕಾರಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ, ಯಾವುದೇ ಆಳದಲ್ಲಿ ಪ್ರಕಾರಗಳನ್ನು ದಾಟಲು ಮತ್ತು ಮಾರ್ಪಡಿಸಲು ಅನುಮತಿಸುವ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.
ಆದಾಗ್ಯೂ, ಟೈಪ್-ಲೆವೆಲ್ ರಿಕರ್ಶನ್ ಮಿತಿಗಳನ್ನು ಹೊಂದಿದೆ. ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ರಿಕರ್ಶನ್ ಡೆಪ್ತ್ ಮಿತಿಯನ್ನು (ಸಾಮಾನ್ಯವಾಗಿ 50 ಮಟ್ಟಗಳ ಸುತ್ತ, ಅದು ಬದಲಾಗಬಹುದಾದರೂ) ಹೊಂದಿದೆ, ಅದರ ನಂತರ ಅನಂತ ಟೈಪ್ ಲೆಕ್ಕಾಚಾರಗಳನ್ನು ತಡೆಯಲು ಅದು ದೋಷ ನೀಡುತ್ತದೆ. ಅನಂತ ಲೂಪ್ಗಳಲ್ಲಿ ಬೀಳುವುದನ್ನು ಅಥವಾ ಈ ಮಿತಿಗಳನ್ನು ತಲುಪುವುದನ್ನು ತಪ್ಪಿಸಲು ರಿಕರ್ಸಿವ್ ಪ್ರಕಾರಗಳನ್ನು ಎಚ್ಚರಿಕೆಯಿಂದ ವಿನ್ಯಾಸಗೊಳಿಸುವುದು ಮುಖ್ಯ.
ಉದಾಹರಣೆ: DeepReadonly<T>
Readonly<T> ವಸ್ತುವಿನ ತಕ್ಷಣದ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಓದಲು ಮಾತ್ರ ಮಾಡುತ್ತದೆ, ಆದರೆ ಅದು ನೆಸ್ಟೆಡ್ ಆಬ್ಜೆಕ್ಟ್ಗಳಿಗೆ ರಿಕರ್ಸಿವ್ ಆಗಿ ಅನ್ವಯಿಸುವುದಿಲ್ಲ. ನಿಜವಾದ ಬದಲಾಗದ ರಚನೆಗಾಗಿ, ನಿಮಗೆ DeepReadonly ಅಗತ್ಯವಿದೆ.
type DeepReadonly<T> = T extends object ? { readonly [K in keyof T]: DeepReadonly<T[K]>; } : T;
ಇದನ್ನು ವಿಘಟಿಸೋಣ:
- T extends object ? ... : T;: ಇದು ಕಂಡಿಷನಲ್ ಟೈಪ್ ಆಗಿದೆ. ಇದು T ಒಂದು ವಸ್ತುವೇ (ಅಥವಾ ಶ್ರೇಣಿ, ಇದು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ವಸ್ತುವೂ ಸಹ) ಎಂದು ಪರಿಶೀಲಿಸುತ್ತದೆ. ಇದು ವಸ್ತುವಲ್ಲದಿದ್ದರೆ (ಅಂದರೆ, ಅದು string, number, boolean, null, undefined, ಅಥವಾ ಫಂಕ್ಷನ್ನಂತಹ ಮೂಲಭೂತವಾಗಿದೆ), ಅದು T ಅನ್ನು ತನ್ನದೇ ಆಗಿ ಹಿಂದಿರುಗಿಸುತ್ತದೆ, ಏಕೆಂದರೆ ಮೂಲಭೂತಗಳು ಸಹಜವಾಗಿ ಬದಲಾಗುವುದಿಲ್ಲ.
- { readonly [K in keyof T]: DeepReadonly<T[K]>; }: T ಒಂದು ವಸ್ತುವಾಗಿದ್ದರೆ, ಇದು ಮ್ಯಾಪ್ಡ್ ಟೈಪ್ ಅನ್ನು ಅನ್ವಯಿಸುತ್ತದೆ.
- readonly [K in keyof T]: ಇದು T ಯಲ್ಲಿನ ಪ್ರತಿ ಗುಣಲಕ್ಷಣ K ಅನ್ನು ಪುನರಾವರ್ತಿಸುತ್ತದೆ ಮತ್ತು ಅದನ್ನು readonly ಎಂದು ಗುರುತಿಸುತ್ತದೆ.
- DeepReadonly<T[K]>: ನಿರ್ಣಾಯಕ ಭಾಗ. ಪ್ರತಿ ಗುಣಲಕ್ಷಣದ ಮೌಲ್ಯ T[K] ಗಾಗಿ, ಇದು DeepReadonly ಅನ್ನು ರಿಕರ್ಸಿವ್ ಆಗಿ ಕರೆಯುತ್ತದೆ. T[K] ಸ್ವತಃ ವಸ್ತುವಾಗಿದ್ದರೆ, ಪ್ರಕ್ರಿಯೆಯು ಪುನರಾವರ್ತನೆಗೊಳ್ಳುತ್ತದೆ, ಅದರ ನೆಸ್ಟೆಡ್ ಗುಣಲಕ್ಷಣಗಳು ಸಹ ಓದಲು ಮಾತ್ರ ಆಗುತ್ತವೆ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ.
ಉದಾಹರಣೆ ಬಳಕೆ:
interface UserSettings { theme: 'dark' | 'light'; notifications: { email: boolean; sms: boolean; }; preferences: string[]; }
type ImmutableUserSettings = DeepReadonly<UserSettings>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type ImmutableUserSettings = { readonly theme: "dark" | "light"; readonly notifications: { readonly email: boolean; readonly sms: boolean; }; readonly preferences: readonly string[]; // ಅರೇ ಅಂಶಗಳು ಓದಲು ಮಾತ್ರವಲ್ಲ, ಆದರೆ ಅರೇ ಸ್ವತಃ. }; */
const userConfig: ImmutableUserSettings = { theme: 'dark', notifications: { email: true, sms: false }, preferences: ['darkMode', 'notifications'] };
// userConfig.theme = 'light'; // ದೋಷ! // userConfig.notifications.email = false; // ದೋಷ! // userConfig.preferences.push('locale'); // ದೋಷ! (ಅರೇ ಉಲ್ಲೇಖಕ್ಕಾಗಿ, ಅದರ ಅಂಶಗಳಿಗೆ ಅಲ್ಲ)
ಉದಾಹರಣೆ: DeepPartial<T>
DeepReadonly ನಂತೆಯೇ, DeepPartial ಎಲ್ಲಾ ಗುಣಲಕ್ಷಣಗಳನ್ನು, ನೆಸ್ಟೆಡ್ ಆಬ್ಜೆಕ್ಟ್ಗಳ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಒಳಗೊಂಡಂತೆ, ಐಚ್ಛಿಕವಾಗಿಸುತ್ತದೆ.
type DeepPartial<T> = T extends object ? { [K in keyof T]?: DeepPartial<T[K]>; } : T;
ಉದಾಹರಣೆ ಬಳಕೆ:
interface PaymentDetails { card: { number: string; expiry: string; }; billingAddress: { street: string; city: string; zip: string; country: string; }; }
type PaymentUpdate = DeepPartial<PaymentDetails>; /* ಇದಕ್ಕೆ ಸಮನಾಗಿರುತ್ತದೆ: type PaymentUpdate = { card?: { number?: string; expiry?: string; }; billingAddress?: { street?: string; city?: string; zip?: string; country?: string; }; }; */
const updateAddress: PaymentUpdate = { billingAddress: { country: 'Canada', zip: 'A1B 2C3' } };
ರಿಕರ್ಸಿವ್ ಪ್ರಕಾರಗಳು ಉದ್ಯಮ ಅಪ್ಲಿಕೇಶನ್ಗಳು, API ಪೇಲೋಡ್ಗಳು ಮತ್ತು ಜಾಗತಿಕ ಸಿಸ್ಟಮ್ಗಳಿಗಾಗಿ ಕಾನ್ಫಿಗರೇಶನ್ ನಿರ್ವಹಣೆಯಲ್ಲಿ ಸಾಮಾನ್ಯವಾದ ಸಂಕೀರ್ಣ, ಕ್ರಮಾನುಗತ ಡೇಟಾ ಮಾದರಿಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಅಗತ್ಯವಾಗಿದೆ, ಇದು ಆಳವಾದ ರಚನೆಗಳಾದ್ಯಂತ ಭಾಗಶಃ ನವೀಕರಣಗಳು ಅಥವಾ ಬದಲಾಗದ ಸ್ಥಿತಿಗಳಿಗೆ ನಿಖರವಾದ ಟೈಪ್ ವ್ಯಾಖ್ಯಾನಗಳನ್ನು ಅನುಮತಿಸುತ್ತದೆ.
ಟೈಪ್ ಗಾರ್ಡ್ಸ್ ಮತ್ತು ಅಸೆರ್ಶನ್ ಫಂಕ್ಷನ್ಸ್: ರನ್ಟೈಮ್ ಟೈಪ್ ರಿಫೈನ್ಮೆಂಟ್
ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ ಪ್ರಾಥಮಿಕವಾಗಿ ಕಂಪೈಲ್-ಟೈಮ್ನಲ್ಲಿ ಸಂಭವಿಸಿದರೂ, ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ರನ್ಟೈಮ್ನಲ್ಲಿ ಪ್ರಕಾರಗಳನ್ನು ಪರಿಷ್ಕರಿಸಲು ಯಾಂತ್ರಿಕತೆಗಳನ್ನು ಸಹ ನೀಡುತ್ತದೆ: ಟೈಪ್ ಗಾರ್ಡ್ಸ್ ಮತ್ತು ಅಸೆರ್ಶನ್ ಫಂಕ್ಷನ್ಸ್. ಈ ವೈಶಿಷ್ಟ್ಯಗಳು ಸ್ಟ್ಯಾಟಿಕ್ ಟೈಪ್ ಚೆಕಿಂಗ್ ಮತ್ತು ಡೈನಾಮಿಕ್ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಎಕ್ಸಿಕ್ಯೂಷನ್ ನಡುವಿನ ಅಂತರವನ್ನು ಸೇತುವೆ ಮಾಡುತ್ತವೆ, ವಿವಿಧ ಮೂಲಗಳಿಂದ ವಿಭಿನ್ನ ಇನ್ಪುಟ್ ಡೇಟಾವನ್ನು (ಜಾಗತಿಕವಾಗಿ) ನಿರ್ವಹಿಸಲು ನಿರ್ಣಾಯಕವಾದ ರನ್ಟೈಮ್ ಪರಿಶೀಲನೆಗಳ ಆಧಾರದ ಮೇಲೆ ಪ್ರಕಾರಗಳನ್ನು ಸಂಕುಚಿತಗೊಳಿಸಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.
ಟೈಪ್ ಗಾರ್ಡ್ಸ್ (ಪ್ರೆಡಿಕೇಟ್ ಫಂಕ್ಷನ್ಸ್)
ಟೈಪ್ ಗಾರ್ಡ್ ಒಂದು ಫಂಕ್ಷನ್ ಆಗಿದ್ದು ಅದು ಬೂಲಿಯನ್ ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ, ಮತ್ತು ಅದರ ರಿಟರ್ನ್ ಪ್ರಕಾರ ಟೈಪ್ ಪ್ರೆಡಿಕೇಟ್ ಆಗಿದೆ. ಟೈಪ್ ಪ್ರೆಡಿಕೇಟ್ parameterName is Type ರೂಪವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ಟೈಪ್ ಗಾರ್ಡ್ ಅನ್ನು ಕರೆ ಮಾಡುವುದನ್ನು ನೋಡಿದಾಗ, ಅದು ಆ ವ್ಯಾಪ್ತಿಯಲ್ಲಿ ವೇರಿಯೇಬಲ್ನ ಪ್ರಕಾರವನ್ನು ಸಂಕುಚಿತಗೊಳಿಸಲು ಫಲಿತಾಂಶವನ್ನು ಬಳಸುತ್ತದೆ.
ಉದಾಹರಣೆ: ಡಿಸ್ಕ್ರಿಮಿನೇಟಿಂಗ್ ಯೂನಿಯನ್ ಟೈಪ್ಗಳು
interface SuccessResponse { status: 'success'; data: any; } interface ErrorResponse { status: 'error'; message: string; code: number; } type ApiResponse = SuccessResponse | ErrorResponse;
function isSuccessResponse(response: ApiResponse): response is SuccessResponse { return response.status === 'success'; }
function handleResponse(response: ApiResponse) { if (isSuccessResponse(response)) { console.log('Data received:', response.data); // 'response' ಈಗ SuccessResponse ಎಂದು ತಿಳಿದಿದೆ } else { console.error('Error occurred:', response.message, 'Code:', response.code); // 'response' ಈಗ ErrorResponse ಎಂದು ತಿಳಿದಿದೆ } }
ಯೂನಿಯನ್ ಟೈಪ್ಗಳೊಂದಿಗೆ ಸುರಕ್ಷಿತವಾಗಿ ಕೆಲಸ ಮಾಡಲು, ವಿಶೇಷವಾಗಿ ಯಶಸ್ಸು ಅಥವಾ ವೈಫಲ್ಯದ ಆಧಾರದ ಮೇಲೆ ವಿಭಿನ್ನ ರಚನೆಗಳನ್ನು ಹಿಂತಿರುಗಿಸಬಹುದಾದ API ಗಳಿಂದ ಡೇಟಾವನ್ನು ಸಂಸ್ಕರಿಸುವಾಗ, ಅಥವಾ ಜಾಗತಿಕ ಈವೆಂಟ್ ಬಸ್ನಲ್ಲಿ ವಿಭಿನ್ನ ಸಂದೇಶ ಪ್ರಕಾರಗಳನ್ನು ನಿರ್ವಹಿಸುವಾಗ ಟೈಪ್ ಗಾರ್ಡ್ಗಳು ಮೂಲಭೂತವಾಗಿವೆ.
ಅಸೆರ್ಶನ್ ಫಂಕ್ಷನ್ಸ್
ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ 3.7 ರಲ್ಲಿ ಪರಿಚಯಿಸಲಾಯಿತು, ಅಸೆರ್ಶನ್ ಫಂಕ್ಷನ್ಗಳು ಟೈಪ್ ಗಾರ್ಡ್ಗಳಂತೆಯೇ ಇರುತ್ತವೆ ಆದರೆ ವಿಭಿನ್ನ ಗುರಿಯನ್ನು ಹೊಂದಿವೆ: ಒಂದು ಷರತ್ತು ನಿಜವೆಂದು ದೃಢಪಡಿಸುವುದು, ಮತ್ತು ಇಲ್ಲದಿದ್ದರೆ, ದೋಷವನ್ನು ಎಸೆಯುವುದು. ಅವುಗಳ ರಿಟರ್ನ್ ಪ್ರಕಾರ asserts condition ಸಿಂಟ್ಯಾಕ್ಸ್ ಅನ್ನು ಬಳಸುತ್ತದೆ. Asserts ಸಿಗ್ನೇಚರ್ ಹೊಂದಿರುವ ಫಂಕ್ಷನ್ ದೋಷ ಎಸೆಯದೆ ಹಿಂದಿರುಗಿದಾಗ, ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ದೃಢೀಕರಣದ ಆಧಾರದ ಮೇಲೆ ಆರ್ಗ್ಯುಮೆಂಟ್ನ ಪ್ರಕಾರವನ್ನು ಸಂಕುಚಿತಗೊಳಿಸುತ್ತದೆ.
ಉದಾಹರಣೆ: ನಾನ್-ನಲ್ಲಬಿಲಿಟಿಯನ್ನು ದೃಢೀಕರಿಸುವುದು
function assertIsDefined<T>(val: T, message?: string): asserts val is NonNullable<T> { if (val === undefined || val === null) { throw new Error(message || 'Value must be defined'); } }
function processConfig(config: { baseUrl?: string; retries?: number }) { assertIsDefined(config.baseUrl, 'Base URL is required for configuration'); // ಈ ಸಾಲಿನ ನಂತರ, config.baseUrl ಖಂಡಿತವಾಗಿಯೂ 'string' ಆಗಿರುತ್ತದೆ, 'string | undefined' ಅಲ್ಲ console.log('Processing data from:', config.baseUrl.toUpperCase()); if (config.retries !== undefined) { console.log('Retries:', config.retries); } }
ಅಸೆರ್ಶನ್ ಫಂಕ್ಷನ್ಗಳು ಮುందಿನ ಷರತ್ತುಗಳನ್ನು ಜಾರಿಗೊಳಿಸಲು, ಇನ್ಪುಟ್ಗಳನ್ನು ಮೌಲ್ಯೀಕರಿಸಲು ಮತ್ತು ಕಾರ್ಯಾಚರಣೆಯೊಂದಿಗೆ ಮುಂದುವರಿಯುವ ಮೊದಲು ನಿರ್ಣಾಯಕ ಮೌಲ್ಯಗಳು ಇರುತ್ತವೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಅತ್ಯುತ್ತಮವಾಗಿವೆ. ಇದು ದೃಢವಾದ ಸಿಸ್ಟಮ್ ವಿನ್ಯಾಸದಲ್ಲಿ ಅಮೂಲ್ಯವಾಗಿದೆ, ವಿಶೇಷವಾಗಿ ಇನ್ಪುಟ್ ಮೌಲ್ಯೀಕರಣಕ್ಕೆ, ಅಲ್ಲಿ ಡೇಟಾ ವಿಶ್ವಾಸಾರ್ಹವಲ್ಲದ ಮೂಲಗಳು ಅಥವಾ ವಿಭಿನ್ನ ಜಾಗತಿಕ ಬಳಕೆದಾರರಿಗಾಗಿ ವಿನ್ಯಾಸಗೊಳಿಸಲಾದ ಬಳಕೆದಾರ ಇನ್ಪುಟ್ ಫಾರ್ಮ್ಗಳಿಂದ ಬರಬಹುದು.
ಟೈಪ್ ಗಾರ್ಡ್ಸ್ ಮತ್ತು ಅಸೆರ್ಶನ್ ಫಂಕ್ಷನ್ಗಳು ಎರಡೂ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನ ಸ್ಟ್ಯಾಟಿಕ್ ಟೈಪ್ ಸಿಸ್ಟಂಗೆ ಡೈನಾಮಿಕ್ ಅಂಶವನ್ನು ಒದಗಿಸುತ್ತವೆ, ಒಟ್ಟಾರೆ ಕೋಡ್ ಸುರಕ್ಷತೆ ಮತ್ತು ಊಹಾತ್ಮಕತೆಯನ್ನು ಹೆಚ್ಚಿಸುವ ಮೂಲಕ ರನ್ಟೈಮ್ ಪರಿಶೀಲನೆಗಳನ್ನು ಕಂಪೈಲ್-ಟೈಮ್ ಪ್ರಕಾರಗಳಿಗೆ ತಿಳಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.
ವಾಸ್ತವಿಕ ಅನ್ವಯಗಳು ಮತ್ತು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು
ಸುಧಾರಿತ ಟೈಪ್ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ ತಂತ್ರಗಳನ್ನು ಕರಗತ ಮಾಡಿಕೊಳ್ಳುವುದು ಕೇವಲ ಶೈಕ್ಷಣಿಕ ವ್ಯಾಯಾಮವಲ್ಲ; ಇದು ಉನ್ನತ-ಗುಣಮಟ್ಟದ ಸಾಫ್ಟ್ವೇರ್ ಅನ್ನು ನಿರ್ಮಿಸಲು, ವಿಶೇಷವಾಗಿ ಜಾಗತಿಕವಾಗಿ ವಿತರಿಸಿದ ಅಭಿವೃದ್ಧಿ ತಂಡಗಳಲ್ಲಿ ಗಂಭೀರ ಪ್ರಾಯೋಗಿಕ ಪರಿಣಾಮಗಳನ್ನು ಹೊಂದಿದೆ.
1. ದೃಢವಾದ API ಕ್ಲೈಂಟ್ ಜನರೇಷನ್
REST ಅಥವಾ GraphQL API ಅನ್ನು ಬಳಸುವ ಕಲ್ಪನೆಯನ್ನು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ. ಪ್ರತಿ ಎಂಡ್ಪಾಯಿಂಟ್ಗಾಗಿ ಪ್ರತಿಕ್ರಿಯೆ ಇಂಟರ್ಫೇಸ್ಗಳನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಟೈಪ್ ಮಾಡುವ ಬದಲು, ನೀವು ಮೂಲ ಪ್ರಕಾರಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಬಹುದು ಮತ್ತು ನಂತರ ವಿನಂತಿಗಳು, ಪ್ರತಿಕ್ರಿಯೆಗಳು ಮತ್ತು ದೋಷಗಳಿಗಾಗಿ ಕ್ಲೈಂಟ್-ಸೈಡ್ ಪ್ರಕಾರಗಳನ್ನು ರಚಿಸಲು ಮ್ಯಾಪ್ಡ್, ಕಂಡಿಷನಲ್ ಮತ್ತು ಇನ್ಫರೆನ್ಸ್ ಪ್ರಕಾರಗಳನ್ನು ಬಳಸಬಹುದು. ಉದಾಹರಣೆಗೆ, GraphQL ಕ್ವೆರಿ ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಟೈಪ್ಡ್ ಫಲಿತಾಂಶ ವಸ್ತುವಾಗಿ ಪರಿವರ್ತಿಸುವ ಪ್ರಕಾರವು ಕ್ರಿಯೆಯಲ್ಲಿ ಸುಧಾರಿತ ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ನ ಒಂದು ಪ್ರಮುಖ ಉದಾಹರಣೆಯಾಗಿದೆ. ಇದು ವಿವಿಧ ಕ್ಲೈಂಟ್ಗಳು ಮತ್ತು ವಿವಿಧ ಪ್ರದೇಶಗಳಲ್ಲಿ ನಿಯೋಜಿಸಲಾದ ಮೈಕ್ರೋಸರ್ವಿಸ್ಗಳಾದ್ಯಂತ ಸ್ಥಿರತೆಯನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.
2. ಫ್ರೇಮ್ವರ್ಕ್ ಮತ್ತು ಲೈಬ್ರರಿ ಅಭಿವೃದ್ಧಿ
React, Vue, ಮತ್ತು Angular, ಅಥವಾ Redux Toolkit ನಂತಹ ಯುಟಿಲಿಟಿ ಲೈಬ್ರರಿಗಳಂತಹ ಪ್ರಮುಖ ಫ್ರೇಮ್ವರ್ಕ್ಗಳು ಅತ್ಯುತ್ತಮ ಡೆವಲಪರ್ ಅನುಭವವನ್ನು ಒದಗಿಸಲು ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ ಅನ್ನು ಹೆಚ್ಚು ಅವಲಂಬಿಸಿವೆ. ಅವರು ಪ್ರೊಪ್ಗಳು, ಸ್ಟೇಟ್, ಆಕ್ಷನ್ ಕ್ರಿಯೇಟರ್ಗಳು ಮತ್ತು ಸೆಲೆಕ್ಟರ್ಗಳಿಗಾಗಿ ಪ್ರಕಾರಗಳನ್ನು ಊಹಿಸಲು ಈ ತಂತ್ರಗಳನ್ನು ಬಳಸುತ್ತಾರೆ, ಡೆವಲಪರ್ಗಳು ಬಲವಾದ ಟೈಪ್ ಸುರಕ್ಷತೆಯನ್ನು ಉಳಿಸಿಕೊಂಡು ಕಡಿಮೆ ಬಾಯ್ಲರ್ಪ್ಲೇಟ್ ಬರೆಯಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ವಿಸ್ತರಣೀಯತೆ ಜಾಗತಿಕ ಡೆವಲಪರ್ ಸಮುದಾಯದಿಂದ ಅಳವಡಿಸಿಕೊಂಡ ಲೈಬ್ರರಿಗಳಿಗೆ ನಿರ್ಣಾಯಕವಾಗಿದೆ.
3. ಸ್ಟೇಟ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್ ಮತ್ತು ಇಮ್ಮ್ಯುಟಬಿಲಿಟಿ
ಸಂಕೀರ್ಣ ರಾಜ್ಯದೊಂದಿಗೆ ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ, ಬದಲಾಗದಿರುವುದನ್ನು ಖಚಿತಪಡಿಸುವುದು ಊಹಾತ್ಮಕ ವರ್ತನೆಗೆ ಮುಖ್ಯವಾಗಿದೆ. DeepReadonly ಪ್ರಕಾರಗಳು ಕಂಪೈಲ್-ಟೈಮ್ನಲ್ಲಿ ಇದನ್ನು ಜಾರಿಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತವೆ, ಆಕಸ್ಮಿಕ ಮಾರ್ಪಾಡುಗಳನ್ನು ತಡೆಯುತ್ತದೆ. ಅದೇ ರೀತಿ, ಸ್ಟೇಟ್ ನವೀಕರಣಗಳಿಗಾಗಿ ನಿಖರವಾದ ಪ್ರಕಾರಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುವುದು (ಉದಾ., ಪ್ಯಾಚ್ ಕಾರ್ಯಾಚರಣೆಗಳಿಗಾಗಿ DeepPartial ಬಳಸಿ) ರಾಜ್ಯದ ಸ್ಥಿರತೆಗೆ ಸಂಬಂಧಿಸಿದ ದೋಷಗಳನ್ನು ಗಣನೀಯವಾಗಿ ಕಡಿಮೆ ಮಾಡಬಹುದು, ಇದು ಪ್ರಪಂಚದಾದ್ಯಂತ ಬಳಕೆದಾರರಿಗೆ ಸೇವೆ ಸಲ್ಲಿಸುವ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ನಿರ್ಣಾಯಕವಾಗಿದೆ.
4. ಕಾನ್ಫಿಗರೇಶನ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್
ಅಪ್ಲಿಕೇಶನ್ಗಳು ಸಾಮಾನ್ಯವಾಗಿ ಸಂಕೀರ್ಣ ಕಾನ್ಫಿಗರೇಶನ್ ಆಬ್ಜೆಕ್ಟ್ಗಳನ್ನು ಹೊಂದಿರುತ್ತವೆ. ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ ಕಟ್ಟುನಿಟ್ಟಾದ ಕಾನ್ಫಿಗರೇಶನ್ಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು, ಪರಿಸರ-ನಿರ್ದಿಷ್ಟ ಓವರ್ರೈಡ್ಗಳನ್ನು ಅನ್ವಯಿಸಲು (ಉದಾ., ಅಭಿವೃದ್ಧಿ ವರ್ಸಸ್ ಉತ್ಪಾದನೆ ಪ್ರಕಾರಗಳು), ಅಥವಾ ಸ್ಕೀಮಾ ವ್ಯಾಖ್ಯಾನಗಳನ್ನು ಆಧರಿಸಿ ಕಾನ್ಫಿಗರೇಶನ್ ಪ್ರಕಾರಗಳನ್ನು ಉತ್ಪಾದಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಇದು ವಿಭಿನ್ನ ನಿಯೋಜನೆ ಪರಿಸರಗಳು, ಸಂಭಾವ್ಯವಾಗಿ ವಿಭಿನ್ನ ಖಂಡಗಳಾದ್ಯಂತ, ಕಟ್ಟುನಿಟ್ಟಾದ ನಿಯಮಗಳಿಗೆ ಬದ್ಧವಾಗಿರುವ ಕಾನ್ಫಿಗರೇಶನ್ಗಳನ್ನು ಬಳಸುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.
5. ಈವೆಂಟ್-ಡ್ರಿವನ್ ಆರ್ಕಿಟೆಕ್ಚರ್ಗಳು
ವಿಭಿನ್ನ ಘಟಕಗಳು ಅಥವಾ ಸೇವೆಗಳ ನಡುವೆ ಈವೆಂಟ್ಗಳು ಹರಿಯುವ ಸಿಸ್ಟಮ್ಗಳಲ್ಲಿ, ಸ್ಪಷ್ಟ ಈವೆಂಟ್ ಪ್ರಕಾರಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುವುದು ಮುಖ್ಯವಾಗಿದೆ. ಟೆಂಪ್ಲೇಟ್ ಲಿಟರಲ್ ಟೈಪ್ಗಳು ಅನನ್ಯ ಈವೆಂಟ್ ID ಗಳನ್ನು (ಉದಾ., USER_CREATED_V1) ರಚಿಸಬಹುದು, ಆದರೆ ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳು ವಿಭಿನ್ನ ಈವೆಂಟ್ ಪೇಲೋಡ್ಗಳನ್ನು ವಿಭಿನ್ನಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡಬಹುದು, ನಿಮ್ಮ ಸಿಸ್ಟಂನ ಸಡಿಲವಾಗಿ ಜೋಡಿಸಲಾದ ಭಾಗಗಳ ನಡುವೆ ದೃಢವಾದ ಸಂವಹನವನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.
ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು:
- ಸರಳವಾಗಿ ಪ್ರಾರಂಭಿಸಿ: ತಕ್ಷಣವೇ ಅತ್ಯಂತ ಸಂಕೀರ್ಣ ಪರಿಹಾರಕ್ಕೆ ಧುಮುಕಬೇಡಿ. ಮೂಲಭೂತ ಯುಟಿಲಿಟಿ ಟೈಪ್ಗಳೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಅಗತ್ಯವಿದ್ದಾಗ ಮಾತ್ರ ಸಂಕೀರ್ಣತೆಯನ್ನು ಲೇಯರ್ ಮಾಡಿ.
- ಸಂಪೂರ್ಣವಾಗಿ ಡಾಕ್ಯುಮೆಂಟ್ ಮಾಡಿ: ಸುಧಾರಿತ ಪ್ರಕಾರಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು ಸವಾಲಾಗಿರಬಹುದು. ಅವುಗಳ ಉದ್ದೇಶ, ನಿರೀಕ್ಷಿತ ಇನ್ಪುಟ್ಗಳು ಮತ್ತು ಔಟ್ಪುಟ್ಗಳನ್ನು ವಿವರಿಸಲು JSDoc ಕಾಮೆಂಟ್ಗಳನ್ನು ಬಳಸಿ. ಇದು ಯಾವುದೇ ತಂಡಕ್ಕೆ, ವಿಶೇಷವಾಗಿ ವಿಭಿನ್ನ ಭಾಷಾ ಹಿನ್ನೆಲೆಗಳನ್ನು ಹೊಂದಿರುವವರಿಗೆ ನಿರ್ಣಾಯಕವಾಗಿದೆ.
- ನಿಮ್ಮ ಟೈಪ್ಗಳನ್ನು ಪರೀಕ್ಷಿಸಿ: ಹೌದು, ನೀವು ಟೈಪ್ಗಳನ್ನು ಪರೀಕ್ಷಿಸಬಹುದು! tsd (TypeScript Definition Tester) ನಂತಹ ಪರಿಕರಗಳನ್ನು ಬಳಸಿ ಅಥವಾ ನಿಮ್ಮ ಪ್ರಕಾರಗಳು ನಿರೀಕ್ಷಿಸಿದಂತೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ ಎಂದು ಪರಿಶೀಲಿಸಲು ಸರಳ ನಿಯೋಜನೆಗಳನ್ನು ಬರೆಯಿರಿ.
- ಪುನರ್ಬಳಕೆಯನ್ನು ಆದ್ಯತೆ ನೀಡಿ: ಅಸಮರ್ಪಕ, ಒಂದು-ಬಾರಿ ಟೈಪ್ ಡಿಕ್ಲರೇಶನ್ಗಳ ಬದಲಿಗೆ ನಿಮ್ಮ ಕೋಡ್ಬೇಸ್ನಾದ್ಯಂತ ಮರುಬಳಕೆ ಮಾಡಬಹುದಾದ ಸಾಮಾನ್ಯ ಯುಟಿಲಿಟಿ ಟೈಪ್ಗಳನ್ನು ರಚಿಸಿ.
- ಸಂಕೀರ್ಣತೆ ವರ್ಸಸ್ ಸ್ಪಷ್ಟತೆ: ಅತಿಯಾದ ಸಂಕೀರ್ಣ ಟೈಪ್ ಮ್ಯಾಜಿಕ್ ನಿರ್ವಹಣೆ ಹೊರೆಯನ್ನು ಉಂಟುಮಾಡಬಹುದಾದರೂ. ಟೈಪ್ ಡೆಫಿನಿಷನ್ಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವ ಅರಿವಿನ ಹೊರೆಯನ್ನು ಮೀರಿದ ಟೈಪ್ ಸುರಕ್ಷತೆಯ ಪ್ರಯೋಜನಗಳು ಇರುವ ಸಮತೋಲನಕ್ಕಾಗಿ ಶ್ರಮಿಸಿ.
- ಸಂಕಲನ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಿ: ಅತ್ಯಂತ ಸಂಕೀರ್ಣ ಅಥವಾ ಆಳವಾಗಿ ರಿಕರ್ಸಿವ್ ಪ್ರಕಾರಗಳು ಕೆಲವೊಮ್ಮೆ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ಸಂಕಲನವನ್ನು ನಿಧಾನಗೊಳಿಸಬಹುದು. ನೀವು ಕಾರ್ಯಕ್ಷಮತೆಯ ಅವನತಿಯನ್ನು ಗಮನಿಸಿದರೆ, ನಿಮ್ಮ ಟೈಪ್ ಡೆಫಿನಿಷನ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ.
ಸುಧಾರಿತ ವಿಷಯಗಳು ಮತ್ತು ಭವಿಷ್ಯದ ದಿಕ್ಕುಗಳು
ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ ಜರ್ನಿ ಇಲ್ಲಿಗೆ ಮುಗಿಯುವುದಿಲ್ಲ. ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ತಂಡವು ನಿರಂತರವಾಗಿ ನವೀಕರಿಸುತ್ತಿದೆ, ಮತ್ತು ಸಮುದಾಯವು ಇನ್ನೂ ಹೆಚ್ಚು ಅತ್ಯಾಧುನಿಕ ಪರಿಕಲ್ಪನೆಗಳನ್ನು ಸಕ್ರಿಯವಾಗಿ ಅನ್ವೇಷಿಸುತ್ತದೆ.
ನಾಮಮಾತ್ರದ ವರ್ಸಸ್ ಸ್ಟ್ರಕ್ಚರಲ್ ಟೈಪಿಂಗ್
ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ಸ್ಟ್ರಕ್ಚರಲ್ ಆಗಿ ಟೈಪ್ ಮಾಡಲ್ಪಟ್ಟಿದೆ, ಅಂದರೆ ಎರಡು ಪ್ರಕಾರಗಳು ಘೋಷಿತ ಹೆಸರುಗಳ ಹೊರತಾಗಿಯೂ, ಒಂದೇ ಆಕಾರವನ್ನು ಹೊಂದಿದ್ದರೆ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತವೆ. ಇದಕ್ಕೆ ವಿರುದ್ಧವಾಗಿ, ನಾಮಮಾತ್ರ ಟೈಪಿಂಗ್ (C# ಅಥವಾ Java ನಂತಹ ಭಾಷೆಗಳಲ್ಲಿ ಕಂಡುಬರುತ್ತದೆ) ಪ್ರಕಾರಗಳು ಒಂದೇ ಘೋಷಣೆ ಅಥವಾ ವಂಶಾವಳಿಯ ಸರಣಿಯನ್ನು ಹಂಚಿಕೊಂಡರೆ ಮಾತ್ರ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತವೆ ಎಂದು ಪರಿಗಣಿಸುತ್ತದೆ. ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನ ಸ್ಟ್ರಕ್ಚರಲ್ ಸ್ವಭಾವವು ಸಾಮಾನ್ಯವಾಗಿ ಪ್ರಯೋಜನಕಾರಿಯಾದರೂ, ನಾಮಮಾತ್ರದ ನಡವಳಿಕೆ ಅಪೇಕ್ಷಿತವಾಗಿರುವ ಸನ್ನಿವೇಶಗಳು ಇವೆ (ಉದಾ., UserID ಅನ್ನು ProductID ಪ್ರಕಾರಕ್ಕೆ ನಿಯೋಜಿಸುವುದನ್ನು ತಡೆಯಲು, ಅವೆರಡೂ ಕೇವಲ string ಆಗಿದ್ದರೂ ಸಹ).
ಟೈಪ್ ಬ್ರಾಂಡಿಂಗ್ ತಂತ್ರಗಳು, ಅನನ್ಯ ಚಿಹ್ನೆ ಗುಣಲಕ್ಷಣಗಳು ಅಥವಾ ಲಿಟರಲ್ ಯೂನಿಯನ್ಗಳನ್ನು ಇಂಟರ್ಸೆಕ್ಷನ್ ಪ್ರಕಾರಗಳೊಂದಿಗೆ ಸಂಯೋಜಿಸಿ ಬಳಸುವುದರ ಮೂಲಕ, ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ನಾಮಮಾತ್ರ ಟೈಪಿಂಗ್ ಅನ್ನು ಅನುಕರಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು ರಚನಾತ್ಮಕವಾಗಿ ಸಮಾನವಾದ ಆದರೆ ಪರಿಕಲ್ಪನಾತ್ಮಕವಾಗಿ ವಿಭಿನ್ನ ಪ್ರಕಾರಗಳ ನಡುವೆ ಬಲವಾದ ವ್ಯತ್ಯಾಸಗಳನ್ನು ರಚಿಸಲು ಸುಧಾರಿತ ತಂತ್ರವಾಗಿದೆ.
ಉದಾಹರಣೆ (ಸರಳೀಕೃತ):
type Brand<T, B> = T & { __brand: B }; type UserID = Brand<string, 'UserID'>; type ProductID = Brand<string, 'ProductID'>;
function getUser(id: UserID) { /* ... */ } function getProduct(id: ProductID) { /* ... */ }
const myUserId: UserID = 'user-123' as UserID; const myProductId: ProductID = 'prod-456' as ProductID;
getUser(myUserId); // ಸರಿ // getUser(myProductId); // ದೋಷ: ಪ್ರಕಾರ 'ProductID' ಪ್ರಕಾರ 'UserID' ಗೆ ನಿಯೋಜಿಸಲಾಗುವುದಿಲ್ಲ.
ಟೈಪ್-ಲೆವೆಲ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಪ್ಯಾರಾಡಿಮ್ಗಳು
ಟೈಪ್ಗಳು ಹೆಚ್ಚು ಡೈನಾಮಿಕ್ ಮತ್ತು ಅಭಿವ್ಯಕ್ತವಾಗುತ್ತಿದ್ದಂತೆ, ಡೆವಲಪರ್ಗಳು ಕ್ರಿಯಾತ್ಮಕ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಅನ್ನು ನೆನಪಿಸುವ ಟೈಪ್-ಲೆವೆಲ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಮಾದರಿಗಳನ್ನು ಅನ್ವೇಷಿಸುತ್ತಿದ್ದಾರೆ. ಇದು ಟೈಪ್-ಲೆವೆಲ್ ಲಿಸ್ಟ್ಗಳು, ಸ್ಟೇಟ್ ಮೆಷಿನ್ಗಳು ಮತ್ತು ಟೈಪ್ ಸಿಸ್ಟಂನಲ್ಲಿ ಸಂಪೂರ್ಣವಾಗಿ ಮೂಲಭೂತ ಕಂಪೈಲರ್ಗಳ ತಂತ್ರಗಳನ್ನು ಒಳಗೊಂಡಿದೆ. ಅಪ್ಲಿಕೇಶನ್ ಕೋಡ್ಗೆ ಆಗಾಗ್ಗೆ ಅತಿಯಾದ ಸಂಕೀರ್ಣವಾಗಿದ್ದರೂ, ಈ ಅನ್ವೇಷಣೆಗಳು ಏನು ಸಾಧ್ಯವೋ ಅದರ ಮಿತಿಗಳನ್ನು ತಳ್ಳುತ್ತವೆ ಮತ್ತು ಭವಿಷ್ಯದ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ವೈಶಿಷ್ಟ್ಯಗಳಿಗೆ ತಿಳಿಸುತ್ತವೆ.
ತೀರ್ಮಾನ
ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ಸುಧಾರಿತ ಟೈಪ್ ಟ್ರಾನ್ಸ್ಫರ್ಮೇಷನ್ ತಂತ್ರಗಳು ಕೇವಲ ಸಿಂಟ್ಯಾಕ್ಟಿಕ್ ಸಕ್ಕರೆಗಿಂತ ಹೆಚ್ಚು; ಸಂಕೀರ್ಣ, ಸ್ಥಿತಿಸ್ಥಾಪಕ ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದಾದ ಸಾಫ್ಟ್ವೇರ್ ಸಿಸ್ಟಮ್ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಅವು ಮೂಲಭೂತ ಪರಿಕರಗಳಾಗಿವೆ. ಕಂಡಿಷನಲ್ ಟೈಪ್ಗಳು, ಮ್ಯಾಪ್ಡ್ ಟೈಪ್ಗಳು, infer ಕೀವರ್ಡ್, ಟೆಂಪ್ಲೇಟ್ ಲಿಟರಲ್ ಟೈಪ್ಗಳು ಮತ್ತು ರಿಕರ್ಸಿವ್ ಮಾದರಿಗಳನ್ನು ಅಳವಡಿಸಿಕೊಳ್ಳುವ ಮೂಲಕ, ನೀವು ಕಡಿಮೆ ಕೋಡ್ ಬರೆಯಲು, ಕಂಪೈಲ್-ಟೈಮ್ನಲ್ಲಿ ಹೆಚ್ಚಿನ ದೋಷಗಳನ್ನು ಹಿಡಿಯಲು ಮತ್ತು ಅತ್ಯಂತ ಹೊಂದಿಕೊಳ್ಳುವ ಮತ್ತು ನಂಬಲಾಗದಷ್ಟು ದೃಢವಾದ API ಗಳನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸಲು ಶಕ್ತಿಯನ್ನು ಪಡೆಯುತ್ತೀರಿ.
ಸಾಫ್ಟ್ವೇರ್ ಉದ್ಯಮವು ಜಾಗತೀಕರಣಗೊಳ್ಳುವುದನ್ನು ಮುಂದುವರೆಸುತ್ತಿರುವುದರಿಂದ, ಸ್ಪಷ್ಟ, ನಿರ್ದಿಷ್ಟವಲ್ಲದ ಮತ್ತು ಸುರಕ್ಷಿತ ಕೋಡ್ ಅಭ್ಯಾಸಗಳ ಅಗತ್ಯವು ಇನ್ನಷ್ಟು ನಿರ್ಣಾಯಕವಾಗುತ್ತದೆ. ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ನ ಸುಧಾರಿತ ಟೈಪ್ ಸಿಸ್ಟಂ ಡೇಟಾ ರಚನೆಗಳು ಮತ್ತು ನಡವಳಿಕೆಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ಸಾರ್ವತ್ರಿಕ ಭಾಷೆಯನ್ನು ಒದಗಿಸುತ್ತದೆ, ವಿಭಿನ್ನ ಹಿನ್ನೆಲೆಗಳ ತಂಡಗಳು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಸಹಕರಿಸುವುದನ್ನು ಮತ್ತು ಉನ್ನತ-ಗುಣಮಟ್ಟದ ಉತ್ಪನ್ನಗಳನ್ನು ತಲುಪಿಸುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ. ಈ ತಂತ್ರಗಳನ್ನು ಕರಗತ ಮಾಡಿಕೊಳ್ಳಲು ಸಮಯವನ್ನು ಹೂಡಿಕೆ ಮಾಡಿ, ಮತ್ತು ನಿಮ್ಮ ಟೈಪ್ಸ್ಕ್ರಿಪ್ಟ್ ಅಭಿವೃದ್ಧಿ ಪ್ರಯಾಣದಲ್ಲಿ ನೀವು ಉತ್ಪಾದಕತೆ ಮತ್ತು ವಿಶ್ವಾಸದ ಹೊಸ ಮಟ್ಟವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡುತ್ತೀರಿ.
ನಿಮ್ಮ ಪ್ರಾಜೆಕ್ಟ್ಗಳಲ್ಲಿ ನೀವು ಕಂಡುಕೊಂಡ ಅತ್ಯಂತ ಉಪಯುಕ್ತವಾದ ಸುಧಾರಿತ ಟೈಪ್ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ಗಳು ಯಾವುವು? ಕೆಳಗಿನ ಕಾಮೆಂಟ್ಗಳಲ್ಲಿ ನಿಮ್ಮ ಒಳನೋಟಗಳು ಮತ್ತು ಉದಾಹರಣೆಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಿ!